package kr.co.bettersoft.waitnumbercustomer.activity;

import java.io.IOException;
import java.io.InputStream;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;

import org.json.JSONObject;

import kr.co.bettersoft.waitnumbercustomer.common.CommonConstant;
import kr.co.bettersoft.waitnumbercustomer.common.WaitNumberCustomerRest;
import kr.co.bettersoft.waitnumbercustomer.domain.WaitNumberEvent;

import android.app.Activity;
import android.content.Context;
import android.content.Intent;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Typeface;
import android.os.AsyncTask;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.util.Log;
import android.view.View;
import android.view.Window;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.ImageView;
import android.widget.ProgressBar;
import android.widget.TextView;
import android.widget.Toast;
/**
 * EventDetailActivity
 * 이벤트 상세화면
 * 
 * 가맹점에서 발송한 공지/이벤트가 있을때 사용자는 이벤트 목록에서 이를 확인할 수 있고,
 *  이벤트 목록에서 특정 이벤트를 터치하면 이벤트에 대한 상세정보를 확인할 수 있다.
 */
public class EventDetailActivity extends Activity{
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// 변수 선언
	
	// 상수
	String TAG = "EventDetailActivity";
	
	public final int GET_EVENT_DETAIL = 201; // 이벤트 상세 정보를 가져온다.
	
	String eventImgDomain = CommonConstant.eventImgDomain;
	Bitmap img ;
	
	// 폰트
	private Typeface typefaceNanumGothic= null; 
	private Typeface typefaceNanumGothicBold = null;
	
	int maxPRstr = CommonConstant.maxPRstr;					// 화면에 보여줄 소개 글의 최대 글자수. 넘어가면 자르고 ... 으로 표시해줌.

	// 서버 통신
	String certiResult="";
	WaitNumberCustomerRest waitNumberCustomerRest;
	String callResult = "";
//	String tempstr = "";
//	JSONObject jsonObject;
	
	// 화면 구성
	ImageView eventDetailImageView;
	TextView subjectView;
	TextView contentView ;
//	TextView eventDetailRegisterDateIs ;	
//	TextView eventDetailRegisterDate ;	
	TextView storeNameView ;	
	TextView regDateView ;			
	
	Button topNaviCloseBtn; 		// 상단 닫기 버튼
//	Button closeBtn;
	ProgressBar pb1;		// 중단 로딩 진행바

	// 데이터 저장
	public WaitNumberEvent recievedWaitNumberEvent;		// 인텐트로 전달받은 데이터
	public WaitNumberEvent serverWaitNumberEvent;		// 서버에서 조회한 데이터
	String idWaitingEvents="";				// 이벤트 아이디
	String merchantId="";				// 가맹점 아이디
	String companyName="";				// 가맹점명
	String subject="";				// 이벤트 제목
	String content="";				// 이벤트 본문
	String imageFileUrl="";				// 이미지 주소
	String registerDate="";				// 이벤트 등록일

/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////	
// 핸들러
	
	// 핸들러
	Handler handler = new Handler(){
		@Override
		public void handleMessage(Message msg){
			try{
				Bundle b = msg.getData();		// 받아온결과를 화면에 뿌려준다.
				if(b.getInt("showYN")==1){
					
					if(serverWaitNumberEvent.getImageFileUrl()!=null && serverWaitNumberEvent.getImageFileUrl().length()>0){
						eventDetailImageView.setImageBitmap(serverWaitNumberEvent.getImageFile());
					}else{
						eventDetailImageView.setVisibility(View.GONE);
					}
					Log.d(TAG,"Company name :"+serverWaitNumberEvent.getCompanyName());
					
					subjectView.setText(serverWaitNumberEvent.getSubject());
					contentView.setText(serverWaitNumberEvent.getContent());
//					eventDetailRegisterDate.setText(serverWaitNumberEvent.getRegisterDate());
					
					storeNameView.setText(serverWaitNumberEvent.getCompanyName());
					regDateView.setText(serverWaitNumberEvent.getRegisterDate());  
					
//					if(serverWaitNumberEvent.getRegisterDate().length()>0){
//						eventDetailRegisterDateIs.setVisibility(View.VISIBLE);
//					}
					hidePb();
//					closeBtn.setVisibility(View.VISIBLE);
				}
				if(b.getInt("order")==1){
					// 프로그래스바 실행
					if(pb1==null){
						pb1=(ProgressBar) findViewById(R.id.event_detail_progressbar01);
					}
					pb1.setVisibility(View.VISIBLE);
				}else if(b.getInt("order")==2){
					// 프로그래스바  종료
					if(pb1==null){
						pb1=(ProgressBar) findViewById(R.id.event_detail_progressbar01);
					}
					pb1.setVisibility(View.INVISIBLE);
				}
				if(b.getInt("showErrToast")==1){
					Toast.makeText(EventDetailActivity.this, R.string.error_message, Toast.LENGTH_SHORT).show();
				}
				
				switch (msg.what)
				{
					case GET_EVENT_DETAIL : runOnUiThread(new RunnableGetEventDetail());
						break;
					default : 
						break;
				}

				
			}catch(Exception e){
				e.printStackTrace();
			}
		}
	};

	
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
	
	@Override
	public void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		requestWindowFeature( Window.FEATURE_NO_TITLE );		// no title
		setContentView(R.layout.event_detail_activity);
		
		waitNumberCustomerRest = new WaitNumberCustomerRest();
		serverWaitNumberEvent = new WaitNumberEvent();
		
		eventDetailImageView = (ImageView)findViewById(R.id.event_detail_image_view);
		subjectView = (TextView)findViewById(R.id.event_detail_title);
		contentView = (TextView)findViewById(R.id.event_detail_content);
//		eventDetailRegisterDateIs = (TextView)findViewById(R.id.event_detail_register_date_is);	
//		eventDetailRegisterDate = (TextView)findViewById(R.id.event_detail_register_date);	
		storeNameView = (TextView)findViewById(R.id.store_name_view);	
		regDateView = (TextView)findViewById(R.id.reg_date_view);	
		
		// 폰트 지정.
	    typefaceNanumGothic = Typeface.createFromAsset(getAssets(), CommonConstant.NanumGothic);  
	    typefaceNanumGothicBold = Typeface.createFromAsset(getAssets(), CommonConstant.NanumGothicBold);
	    subjectView.setTypeface(typefaceNanumGothic);
	    contentView.setTypeface(typefaceNanumGothic);
	    storeNameView.setTypeface(typefaceNanumGothicBold);
	    regDateView.setTypeface(typefaceNanumGothic);
		
		
		topNaviCloseBtn = (Button) findViewById(R.id.top_navi_close_btn);
		// 상단 닫기 버튼
		topNaviCloseBtn.setOnClickListener(new OnClickListener() {
			@Override
			public void onClick(View v) {
				finish();
			}
		});
		
//		closeBtn = (Button)findViewById(R.id.event_detail_closebtn);
//		closeBtn.setVisibility(View.INVISIBLE);
//		closeBtn.setOnClickListener(new Button.OnClickListener()  {
//			public void onClick(View v)  {
//				finish();
//			}
//		});	
		// progress bar
		pb1 = (ProgressBar) findViewById(R.id.event_detail_progressbar01);		// 로딩(중앙)
		
		recievedWaitNumberEvent = new WaitNumberEvent();
		getEventDetail_pre();	// 데이터 조회		
	}

	/**
	 * getEventDetail_pre
	 * 전달받은 인텐트에서 데이터를 꺼내고, 유효성 검사후 서버로부터 이벤트 상세 조회 메소드 호출한다.
	 */
	public void getEventDetail_pre(){
		
		// 데이터 받음
		Intent receiveIntent = getIntent();
		idWaitingEvents = receiveIntent.getStringExtra("idWaitingEvents");				
		merchantId = receiveIntent.getStringExtra("merchantId");
			
		companyName = receiveIntent.getStringExtra("companyName");	
		
		subject = receiveIntent.getStringExtra("subject");	
		content = receiveIntent.getStringExtra("content");		
		
		imageFileUrl = receiveIntent.getStringExtra("imageFileUrl");		
		registerDate = receiveIntent.getStringExtra("registerDate");
		
//		Log.d(TAG,"recieve companyName : "+companyName);
//		Log.d(TAG,"recieve subject : "+subject);
//		Log.d(TAG,"recieve content : "+content);
//		Log.d(TAG,"recieve imageFileUrl : "+imageFileUrl);
//		Log.d(TAG,"recieve registerDate : "+registerDate);
		// 받은 데이터 저장
		recievedWaitNumberEvent.setIdWaitingEvents(idWaitingEvents);
		recievedWaitNumberEvent.setMerchantId(merchantId);
		recievedWaitNumberEvent.setCompanyName(companyName);
		recievedWaitNumberEvent.setSubject(subject);
		recievedWaitNumberEvent.setContent(content);
		recievedWaitNumberEvent.setImageFileUrl(imageFileUrl);
		recievedWaitNumberEvent.setRegisterDate(registerDate);
		
		if(merchantId.length()>0){
			handler.sendEmptyMessage(GET_EVENT_DETAIL);
		}else{
			showMSG();		// 에러시 핸들러 통한 토스트
			finish();
		}
	}

/////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// 
	
	
	/**
	 * 러너블. 이벤트 상세 정보를 가져온다.
	 */
	class RunnableGetEventDetail implements Runnable {
		public void run(){
			new backgroundThreadGetEventDetail().execute();
		}
	}
	/**
	 * backgroundThreadGetEventDetail
	 * 비동기 스레드.  서버와 통신하여 이벤트 상세 정보를 가져온다.
	 * @author blue
	 *
	 */
	public class backgroundThreadGetEventDetail extends AsyncTask<Void, Void, Void>{
		@Override protected void onPostExecute(Void result) {  
		} 
		@Override protected void onPreExecute() {  
		} 
		@Override protected Void doInBackground(Void... params) {  
			Log.d(TAG,"backgroundThreadGetEventDetail");
			
			// 파라미터 세팅
			WaitNumberEvent waitNumberEventParam = new WaitNumberEvent();
			waitNumberEventParam.setIdWaitingEvents(idWaitingEvents);
			waitNumberEventParam.setMerchantId(merchantId);
			// 서버 메소드 호출
			showPb();
			callResult = waitNumberCustomerRest.RestGetEventDetail(waitNumberEventParam);
			hidePb();
			// 결과 처리
			if(!(callResult.equals("F"))){		
				try {
					JSONObject jsonObject = new JSONObject(callResult);
					Log.d(TAG, "callResult::"+callResult);
					// 날짜 형식 변환해서 저장하기 용도
					String tmp_registerDate = "";
					int dayOfRegisterDate = 0;			// 오전 오후 분간용
					String dayOfRegisterDateStr = "";	// 다시 문자형 시간으로 변환해서 저장(2자리 유지하기 위함)
					String strAMPM = "";
					String tmp_registerDate2 = "";		// 형식 변환해서 저장용
					
					try{
						serverWaitNumberEvent.setIdWaitingEvents(jsonObject.getString("idWaitingEvents"));				
					}catch(Exception e){
						serverWaitNumberEvent.setIdWaitingEvents("");
					}
					try{
						serverWaitNumberEvent.setMerchantId(jsonObject.getString("merchantId"));				
					}catch(Exception e){
						serverWaitNumberEvent.setMerchantId("");
					}
					// 서버에서 보내지 않는 값이므로 전달받은 값 사용
					serverWaitNumberEvent.setCompanyName(recievedWaitNumberEvent.getCompanyName());
//					try{
//						String tmpCompanyName = jsonObject.getString("companyName");
//						if(tmpCompanyName==null || tmpCompanyName.equals("null")|| tmpCompanyName.length()<1){
//							serverWaitNumberEvent.setCompanyName(recievedWaitNumberEvent.getCompanyName());	
//						}else{
//							serverWaitNumberEvent.setCompanyName(tmpCompanyName);	
//						}
//					}catch(Exception e){
//						serverWaitNumberEvent.setCompanyName("");
//					}
					try{
						serverWaitNumberEvent.setSubject(jsonObject.getString("subject"));				
					}catch(Exception e){
						serverWaitNumberEvent.setSubject("");
					}
					try{
						serverWaitNumberEvent.setContent(jsonObject.getString("content"));				
					}catch(Exception e){
						serverWaitNumberEvent.setContent("");
					}
					try{
						serverWaitNumberEvent.setImageFileUrl(jsonObject.getString("imageFileUrl"));				
					}catch(Exception e){
						serverWaitNumberEvent.setImageFileUrl("");
					}
					try{
						tmp_registerDate = jsonObject.getString("registerDate");		
						// 길면 자르기
						if(tmp_registerDate!=null &&(tmp_registerDate.length()>19)){
							tmp_registerDate = tmp_registerDate.substring(0, 19);		// 2013-05-15 15:21:25  -> 초까지 나옴
						}
						// 오전 오후 분간하기
						dayOfRegisterDate = Integer.parseInt(tmp_registerDate.substring(11, 13));	// dayOfRegisterDate
						if(dayOfRegisterDate>11){		// 12시 넘었을때 = 오후
							dayOfRegisterDate = dayOfRegisterDate - 12;
							strAMPM = getString(R.string.pm)+"";
						}else{				// 12시 이전 = 오전
							strAMPM = getString(R.string.am)+"";
						}
						// 두자리로 맞추기.
						dayOfRegisterDateStr = Integer.toString(dayOfRegisterDate);
						if(dayOfRegisterDate<10){		
							dayOfRegisterDateStr = "0"+dayOfRegisterDateStr;
						}
						// 원하는 날짜 형식에 맞춰서 데이터 넣기
//						tmp_registerDate2 = 
//							tmp_registerDate.substring(0, 4)+getString(R.string.year) 
//							+tmp_registerDate.substring(5, 7) + getString(R.string.month) 
//							+tmp_registerDate.substring(8, 10) + getString(R.string.day) 
//							+ " " + strAMPM + " " 
//							+dayOfRegisterDateStr 
//							+ tmp_registerDate.substring(13);
						
						tmp_registerDate2 = 
							tmp_registerDate.substring(0, 4)+getString(R.string.year) 
							+tmp_registerDate.substring(5, 7) + getString(R.string.month) 
							+tmp_registerDate.substring(8, 10) + getString(R.string.day) 
							+ " " + strAMPM + " " 
							+dayOfRegisterDateStr + getString(R.string.hour) 
							+tmp_registerDate.substring(14, 16) + getString(R.string.minute) 
							+tmp_registerDate.substring(17, 19) + getString(R.string.seconds);
//							+tmp_registerDate.substring(13);
						tmp_registerDate = tmp_registerDate2;	
						
						
						
						serverWaitNumberEvent.setRegisterDate(tmp_registerDate2);	
					}catch(Exception e){
						serverWaitNumberEvent.setRegisterDate("");
					}
					if(serverWaitNumberEvent.getMerchantId().length()<1){
						serverWaitNumberEvent = recievedWaitNumberEvent;
					}
				} catch (Exception e) {
					e.printStackTrace();
					serverWaitNumberEvent = recievedWaitNumberEvent;
				} 
				new backgroundSetImage().execute();		// 비동기로 이미지 작업 후 showInfo(); 호출
				// showInfo();
			}else{
				// 조회에 실패하면 받은 데이터를 사용한다.
				serverWaitNumberEvent = recievedWaitNumberEvent;
				
				new backgroundSetImage().execute();		// 비동기로 이미지 작업 후 showInfo(); 호출
				// showInfo();
			}
			return null; 
		}
	}

	
	/**
	 * backgroundSetImage
	 * 비동기 이미지 받아서 세팅. 이후 showInfo 호출
	 * @author blue
	 *
	 */
	public class backgroundSetImage extends AsyncTask<Void, Void, Void>{
		@Override protected void onPostExecute(Void result) {  
		} 
		@Override protected void onPreExecute() {  
		} 
		@Override protected Void doInBackground(Void... params) {  
			Log.d(TAG,"backgroundSetImage");
			
			if(serverWaitNumberEvent.getImageFileUrl()!=null && serverWaitNumberEvent.getImageFileUrl().length()>0){
				if(serverWaitNumberEvent.getImageFileUrl().contains("http")){		// url 포함한 경우
					try{
						img = LoadImage(serverWaitNumberEvent.getImageFileUrl());
//						bm = LoadImage(tmp_profileThumbnailImageUrl);				 
					}catch(Exception e3){}
				}else{		// url 포함하지 않으면 붙여준다.
					try{
						img = LoadImage(eventImgDomain+serverWaitNumberEvent.getImageFileUrl());				 
					}catch(Exception e3){
						Log.w(TAG, eventImgDomain+serverWaitNumberEvent.getImageFileUrl()+" -- fail");
					}
				}
				serverWaitNumberEvent.setImageFile(img);
			}

			showInfo();
			
			return null; 
		}
	}
	
//////////////////////////////  이미지 받아오기 	/////////////////////////////////////////////////////////////
	
	// 가맹점 이미지 URL 에서 이미지 받아와서 도메인에 저장하는 부분.
	/**
	 * LoadImage
	 *  가맹점 이미지 URL 에서 이미지 받아온 스트림을 비트맵으로 저장한다
	 *
	 * @param $imagePath
	 * @param
	 * @return bm
	 */
	private Bitmap LoadImage( String $imagePath ) {
		InputStream inputStream = OpenHttpConnection( $imagePath ) ;
		Bitmap bm = BitmapFactory.decodeStream( inputStream ) ;
		return bm;
	}
	/**
	 * OpenHttpConnection
	 *  가맹점 이미지 URL 에서 이미지 받아와서 스트림으로 저장한다
	 *
	 * @param $imagePath
	 * @param
	 * @return stream
	 */
	private InputStream OpenHttpConnection(String $imagePath) {
		InputStream stream = null ;
		try {
			URL url = new URL( $imagePath ) ;
			HttpURLConnection urlConnection = (HttpURLConnection) url.openConnection() ;
			urlConnection.setRequestMethod( "GET" ) ;
			urlConnection.connect();
			if( urlConnection.getResponseCode() == HttpURLConnection.HTTP_OK ) {
				stream = urlConnection.getInputStream() ;
			}
		} catch (MalformedURLException e) {
			Log.w(TAG,"MalformedURLException");
		} catch (IOException e) {
			Log.w(TAG,"IOException");
		}
		return stream ;
	}
	
	
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////	
// 유틸

	// 화면에 보여준다..
	/**
	 * showInfo
	 *  이벤트 정보를 화면에 보여준다
	 *
	 * @param
	 * @param
	 * @return
	 */
	public void showInfo(){
		new Thread(
				new Runnable(){
					public void run(){
						Message message = handler.obtainMessage();
						Bundle b = new Bundle();
						b.putInt("showYN", 1);
						message.setData(b);
						handler.sendMessage(message);
					}
				}
		).start();
	}
	
	
	/**
	 * returnThis
	 *  컨택스트를 리턴한다 (핸들러에서 사용)
	 *
	 * @param
	 * @param
	 * @return
	 */
	public Context returnThis(){
		return this;
	}

	/**
	 * showMSG
	 *  화면에 error 토스트 띄운다
	 *
	 * @param
	 * @param
	 * @return
	 */
	public void showMSG(){			// 화면에 error 토스트 띄움..
		new Thread(
				new Runnable(){
					public void run(){
						Message message = handler.obtainMessage();				
						Bundle b = new Bundle();
						b.putInt("showErrToast", 1);
						message.setData(b);
						handler.sendMessage(message);
					}
				}
		).start();
	} 

	// 중앙 프로그래스바 보임, 숨김
	/**
	 * showPb
	 *  중앙 프로그래스바 가시화한다
	 *
	 * @param
	 * @param
	 * @return
	 */
	public void showPb(){
		new Thread( 
				new Runnable(){
					public void run(){
						Message message = handler .obtainMessage();
						Bundle b = new Bundle();
						b.putInt( "order" , 1);
						message.setData(b);
						handler .sendMessage(message);
					}
				}
		).start();
	}

	/**
	 * hidePb
	 *  중앙 프로그래스바 비가시화한다
	 *
	 * @param
	 * @param
	 * @return
	 */
	public void hidePb(){
		new Thread(
				new Runnable(){
					public void run(){
						Message message = handler .obtainMessage();
						Bundle b = new Bundle();
						b.putInt( "order" , 2);
						message.setData(b);
						handler .sendMessage(message);
					}
				}
		).start();
	}
	
}
